package com.coolingme.register05.container02;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 容器缓存单例模式
 * <p>
 * 容器式写法适用于创建实例非常多的情况，便于管理。但是，是非线程安全的。
 *
 * @author wangyue
 * @date 2020/9/29 15:51
 */
public class ContainerSingleton {

    private ContainerSingleton() {

    }

    /**
     * 容器
     * key是class的名称
     */
    private static Map<String, Object> ioc = new ConcurrentHashMap<>();

    /**
     * 从容器中获取实例对象
     *
     * @param clazz Class对象
     * @return 实例对象
     */
    public static Object getInstance(Class clazz) {
        synchronized (ioc) {
            String className = clazz.getName();
            if (!ioc.containsKey(className)) {
                Object object = null;
                try {
                    object = clazz.newInstance();
                    ioc.put(className, object);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return object;
            }
            return ioc.get(className);
        }
    }


}
